
package ija.model.basis;

import ija.model.types.Color;
import java.util.List;

/**
 * Abstraktní třída reprezentuje obecný typ hrací figurky.
 * @author Radek Necas, xnecas18
 * @see ija.model.figures.CheckersFigure, ija.model.figures.PieceGoForward
 * @see ija.model.figures.PieceGoBack, ija.model.figures.Queen
 */
public abstract class Figure {
    protected Position position;
    protected Color color;
    
    /**
     * Konstruktor figurky.
     * @param p pozice figurky
     * @param c barva figurky
     */
    public Figure(Position p, Color c) {
        color = c;
        position = p;
        position.putFigure(this);
    }

    /**
     *
     * @return pozice figurky.
     */
    public Position getPosition() {
        return position;
    }

    /**
     * 
     * @return barvu figurky
     */
    public Color getColor() {
        return color;
    }
    
    /**
     * Metoda testuje, zda je figurka na uvedené pozici.
     * Pozice nemusí být součástí téže šachovnice.
     * @param p testovaná pozice.
     * @return true kladný výsledek, jinak false
     */
    public boolean isAtPosition(Position p) {
        return (position.equals(p));    
    }

    /**
     * Metoda testuje, zda má figurka uvedenou barvu.
     * @param c true ano, false ne.
     * @return 
     */
    public boolean hasColor(Color c) {
        return(color == c);
    }
    
    /**
     * Metoda ruší pozici figurky.
     * Nastavuje odkaz na pozici na null. Odkazovanou pozici v šachovnici ale nemění (její odkaz na figurku).
     */
    public void deletePosition() {
        position = null;
    }
    
    /**
     * Metod posune figurku na uvedenou pozici.
     * Mění všechny související pozice (zdrojovou, cílovou) odpovídajícím způsobem.
     * Pohyb provede pouze pokud je povolený dle typu figurky.
     * @param p pozice kam se má figurka posunout. Měla by být součástí téže šachovnice (ale není testováno).
     * @return true pokud je figurka posunuta, jinak false.
     */
    public boolean move(Position p) {
        if(canMove(p)) {           
            position.removeFigure();
            position = p;
            p.putFigure(this);
            return true;
        }

        return false;
    }
    
    public void uncheckedMove(Position p) {         
    	p.figure = this;
    	this.position.figure = null;
    	this.position = p;
    }
    
    @Override
    public String toString() {
        String s = "Trida: " + this.getClass().getName() + " - Barva: ";
        s += (color == Color.BLACK ? "BLACK" : "WHITE");
        return s;
    }
    
    public abstract boolean canMove(Position p);
    public abstract boolean getMoves(List<String> list, boolean jumpsonly);
    public abstract boolean inDirection(Position p);
}